/**
 * 示例说明
 * <p>
 * HelloOSS是OSS Java SDK的示例程序，您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。
 * 运行方法请参考README。
 * <p>
 * 本示例中的并不包括OSS Java SDK的所有功能，详细功能及使用方法，请参看“SDK手册 > Java-SDK”，
 * 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/。
 * <p>
 * 调用OSS Java SDK的方法时，抛出异常表示有错误发生；没有抛出异常表示成功执行。
 * 当错误发生时，OSS Java SDK的方法会抛出异常，异常中包括错误码、错误信息，详细请参看“SDK手册 > Java-SDK > 异常处理”，
 * 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response。
 * <p>
 * OSS控制台可以直观的看到您调用OSS Java SDK的结果，OSS控制台地址是：https://oss.console.aliyun.com/index#/。
 * OSS控制台使用方法请参看文档中心的“控制台用户指南”， 指南的来链接地址是：https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide。
 * <p>
 * OSS的文档中心地址是：https://help.aliyun.com/document_detail/oss/user_guide/overview.html。
 * OSS Java SDK的文档地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk。
 */

package com.aliyun.oss.demo;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.utils.StringUtils;
import com.aliyun.oss.model.BucketInfo;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

@SuppressWarnings("all")
public class HelloOSS {
    static Logger logger = Logger.getLogger(HelloOSS.class);

    // endpoint是访问OSS的域名
    private static String endpoint = "oss-cn-beijing.aliyuncs.com";
    // accessKeyId和accessKeySecret是OSS的访问密钥
    private static String accessKeyId = "LTAI5tGd3dTM5HiVGm77YsHC";
    private static String accessKeySecret = "秘钥";
    // 仓库名称
    private static String bucketName = "zhangzhixi";
    private static String sufferUrl = "http://zhangzhixi.oss-cn-beijing.aliyuncs.com";

    // Object是OSS存储数据的基本单元，称为OSS的对象，也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Object命名规范如下：使用UTF-8编码，长度必须在1-1023字节之间，不能以“/”或者“\”字符开头。
    private static String firstKey = "my-first-key";

    public static void main(String[] args) {

        // 日志配置，OSS Java SDK使用log4j记录错误信息。示例程序会在工程目录下生成“oss-demo.log”日志文件，默认日志级别是INFO。
        logger.info("Started");

        // 1、生成OSSClient
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 2、创建Bucket
            if (ossClient.doesBucketExist(bucketName)) {
                System.out.println("您已经创建Bucket：" + bucketName + "。");
            } else {
                System.out.println("您的Bucket不存在，创建Bucket：" + bucketName + "。");
                // 创建Bucket
                ossClient.createBucket(bucketName);
            }

            // 3、查看Bucket信息。
            BucketInfo info = ossClient.getBucketInfo(bucketName);
            System.out.println("Bucket " + bucketName + "的信息如下：");
            System.out.println("\t数据中心：" + info.getBucket().getLocation());
            System.out.println("\t创建时间：" + info.getBucket().getCreationDate());
            System.out.println("\t用户标志：" + info.getBucket().getOwner());

            // 4、把字符串存入OSS
            InputStream is = new ByteArrayInputStream("Hello OSS".getBytes());
            ossClient.putObject(bucketName, firstKey, is);
            System.out.println("Object：" + firstKey + "存入OSS成功。");

            // 5、下载文件。
            OSSObject ossObject = ossClient.getObject(bucketName, firstKey);
            InputStream inputStream = ossObject.getObjectContent();
            StringBuilder objectContent = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            while (true) {
                String line = reader.readLine();
                if (line == null)
                    break;
                objectContent.append(line);
            }
            inputStream.close();
            System.out.println("Object：" + firstKey + "的内容是：" + objectContent);

            // 6、上传文件
            String fileKey = "C:\\Users\\华信彭于晏\\Pictures\\壁纸\\timg.jpg";
            /*是图片就放在这个images下*/
            String uploadFileName = "";
            if ("jpg".equals(fileKey.substring(fileKey.lastIndexOf(".") + 1, fileKey.length()))) {
                /*上传的文件名称*/
                uploadFileName = "images/" + fileKey.substring(fileKey.lastIndexOf("\\") + 1, fileKey.length());
            }

            ObjectListing objectListing = ossClient.listObjects(bucketName);
            List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries();

            for (OSSObjectSummary object : objectSummary) {
                createFile(ossClient, fileKey, uploadFileName, object);
            }

            // 7、删除Object
            ossClient.deleteObject(bucketName, firstKey);
            System.out.println("删除Object：" + firstKey + "成功。");
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }

        logger.info("Completed");
    }

    /**
     * 创建文件的方法
     * @param ossClient oss客户端
     * @param fileKey 完整文件名
     * @param uploadFileName 上传的文件名
     * @param object 遍历出来的每一个文件对象
     */
    private static void createFile(OSS ossClient, String fileKey, String uploadFileName, OSSObjectSummary object) {
        /*如果这个文件存在，就先删除，再创建*/
        if (StringUtils.isNullOrEmpty(uploadFileName)) {
            System.out.println("您的文件不符合规范，请检查……");
        } else if (uploadFileName.equals(object.getKey()) && !StringUtils.isNullOrEmpty(uploadFileName)) {
            ossClient.deleteObject(bucketName, uploadFileName);
            System.out.println("删除Object：" + uploadFileName + "成功。");

            /*创建*/
            ossClient.putObject(bucketName, uploadFileName, new File(fileKey));
            System.out.println("Object：" + fileKey + "存入OSS成功。");
        } else {/*不存在直接创建*/
            ossClient.putObject(bucketName, uploadFileName, new File(fileKey));
            System.out.println("Object：" + uploadFileName + "存入OSS成功。");
        }
    }

}
